﻿using shop.Models;
using shop.Models.Database;
using StackExchange.Redis;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

namespace shop.Serives
{
    /// <summary>
    /// 购物车服务类
    /// </summary>
    public class CarService:ICarService
    {
        private readonly IDatabase _redis;
        private readonly shopContext _db;
        public CarService(RedisHelper client, shopContext db)
        {
            //创建Redis连接对象
            _redis = client.GetDatabase();
            _db = db;
        }

        #region Redis实现购物车
        //购物车相关方法
        /// <summary>
        /// 添加购物车
        /// </summary>
        /// <param name="userId"></param>
        /// <param name="goodId"></param>
        public void AddCar(string userId,int goodId)
        {
            //1、用户购车的key
            var key = "UserCar" + userId;
            //添加购物车数量  //如果hash没有 增加一条数据 否则 在有的基础上+1
            _redis.HashIncrement(key, goodId);
        }
        /// <summary>
        /// 减少购物车数量
        /// </summary>
        public void DiffCar(string userId,int goodId)
        {
            //1、用户购车的key
            var key = "UserCar" + userId;
            //减少hash里对应商品Id的值 -1
            var value = _redis.HashDecrement(key, goodId);
            //如果减少后等于0 时 就要删除   -1 
            if(value <= 0)
            {
                //删除
                _redis.HashDelete(key, goodId);
            }

        }
        /// <summary>
        /// 移除购物车商品
        /// </summary>
        /// <param name="userId"></param>
        /// <param name="goodId"></param>
        public void RemoveCar(string userId, int goodId)
        {
             //1、用户购车的key
            var key = "UserCar" + userId;
            //a删除
            _redis.HashDelete(key, goodId);
        }
        /// <summary>
        /// 获取购物车商品
        /// </summary>
        /// <returns></returns>
        public List<CarGoods> GetCarGoods(string userId)
        {
            var list = new List<CarGoods>();
                //1、用户购车的key
            var key = "UserCar" + userId;
            var hashData = _redis.HashGetAll(key);
            //循环遍历 取出来的hash数组 
            //商品Id  数量
            //2         1
            //10        2
            foreach(var item in hashData)
            {
                //item.Name 商品 Id  
                //item.Value 商品 数量
                //a通过商品Id查询商品的标题和图片
                var good = _db.Goods.FirstOrDefault(x => x.GoodId == (int)item.Name);
                if (good != null)
                {
                    list.Add(new CarGoods()
                    {
                        GoodId = (int)item.Name,
                        Count = (int)item.Value,
                        Title = good.Title,
                        Photo = good.Photo,
                        Price = good.Price
                    });
                }
            }
            return list;
        }
        #endregion

        #region SQL Server实现购物车
        /// <summary>
        /// 添加购物车
        /// </summary>
        public bool AddCarForSQL(int userId,int goodId)
        {
            //先看购物车有没有这个商品
            var car = _db.Cars.FirstOrDefault(x => x.UserId == userId && x.GoodId == goodId);
            //有的话 就数量+1
            if (car != null)
            {
                //自增
                car.Count++;
                _db.Cars.Update(car);
            }
            //没有的话 创建一个记录
            else
            {
                _db.Cars.Add(new Car
                {
                    GoodId = goodId,
                    UserId = userId,
                    CreateTime = DateTime.Now,
                    Count = 1
                });
            }
           return _db.SaveChanges() > 0;
        }
        /// <summary>
        /// 减少购物车
        /// </summary>
        public bool DiffCarForSQL(int userId,int goodId)
        {
            //取出购物车的商品记录
            var car = _db.Cars.FirstOrDefault(x => x.UserId == userId && x.GoodId == goodId);
            //非空判断
            if(car != null)
            {
                //看数量如果数量==1 直接删除商品
                if(car.Count==1)
                {
                    _db.Cars.Remove(car);
                }
                //否则 数量-1 更新数据
                else
                {
                    //自减
                    car.Count--;
                    _db.Cars.Update(car);
                }
               return _db.SaveChanges() > 0;
            }
            //如果car为空（null） 则car.Count会报错 
            return false;
        }
        /// <summary>
        /// 删除购物车商品
        /// </summary>
        /// <returns></returns>
        public bool DeleteCarForSQL(int userId,int goodId)
        {
            //取出购物车的商品记录
            var car = _db.Cars.FirstOrDefault(x => x.UserId == userId && x.GoodId == goodId);
            //非空判断
            if (car != null)
            {
                _db.Cars.Remove(car);
                return _db.SaveChanges() > 0;
            }
            //如果car为空（null） 则car.Count会报错 
            return false;
        }
        /// <summary>
        /// 查询购物车商品
        /// </summary>
        /// <returns></returns>
        public List<CarGoods> GetCarGoodsForSQL(int userId)
        {
            //商品Id,商品标题，商品图片，商品价格，购物车商品数量 CarGoods


            // 商品Id 购物车商品数量
          var list=_db.Cars.Where(x => x.UserId == userId)
                //商品表  ,商品标题，商品图片，商品价格 
                //关联查询
                //    连接表   第一个表关联字段  第二表关联字段
                .Join(_db.Goods , x=>x.GoodId , y=>y.GoodId , (x,y)=>new CarGoods
                {
                    GoodId=x.GoodId,
                    Count=x.Count,
                    Title=y.Title,
                    Photo=y.Photo,
                    Price=y.Price
                })
                .ToList();
            return list;
        }

        #endregion
    }
}
